package test;


/*

其中
k1 表示 key
v1 表示 value
= 是 kv分隔符
；是 pair分隔符
，是value间的分隔符
value中如果有异议字符（例如上面提到的=，；等）用 "" 括起来

    inputString: k1=v1;k2=v2;k3=v3;k4=v41,v42
    输出的Map有四个kv键值对（->之前为key，之后为value）
    outputString: Map<k1->v1, k2->v2, k3->v3, k4->v41,v42>
*/

import java.util.*;


public class KvExtractor {

    public static void main(String[] args) {
//        test("k4=\"k5=;;;v5\""); 尚未处理
//        String str = "k1=v1;k2=v2;k3=v3;k4=v41,v42";
//        String str = "v2;k3=v3;k4=\"\\\"k5=v5\\\";k6=v6\"";
//        String str = "v2;k3=v3;k4=\"k5=v5;k6=v6\"";
//        String str = "k1=; k2=v2;k3=v3;k4=\"k5=v5\"";
        String str = "k1=v1;k2=v2;k3=v3;k4=\"k5=v5\"";
        Map<String, String> res = new HashMap<>();

        String[] strings = str.split(";");
        // 字符串不完整 暂存
        StringBuilder temp = new StringBuilder();
        for (String s : strings){
            if (!s.isEmpty()){

                // 字符串中包含 ; =
                int count = 0;
                int count1 = 0;
                for (int i=0; i<s.length(); i++){
                    if ("\"".equals(String.valueOf(s.charAt(i)))){
                        count++;
                    }else if("=".equals(String.valueOf(s.charAt(i)))){
                        count1++;
                    }
                }

                // 非键值对格式
                if(!s.contains("=") || (count1 ==1 && s.endsWith("="))){
                    continue;
                }

                // 上一个键值对字符串尚未结束
                if (temp.length() > 0){
                    // 还未结束
                    if ((count & 1) == 0){
                        temp.append(s);
                        continue;
                    }else {
                        // 已结束
                        s = temp+s;
                    }
                }else if ((count&1)==1) {
                    // 键值对未结束
                    temp = new StringBuilder(s).append(";");
                    continue;
                }

                // 键
                String key = s.substring(0,s.indexOf("="));
                // 值
                String value = s.substring(s.indexOf("=")+1);
                if(value.startsWith("\"") && value.endsWith("\"")){
                    value = value.substring(1,value.length()-1);
                }
                res.put(key,value);
            }
        }

        for (Map.Entry<String,String> map : res.entrySet()){
            System.out.println(map.getKey()+"->"+map.getValue());
        }

    }

    public static String test(String s){

//        System.out.println(s.substring(s.indexOf("=")+1));


//        String value = s.substring(s.indexOf("=")+1);
//        if(value.startsWith("\"") && value.endsWith("\"")){
//            value = value.substring(1,value.length()-1);
//        }
//        System.out.println(value);



//        String[] str = s.split(";");
//        for (String s1 : str) {
//            if(s1.isEmpty()){
//                System.out.println(";");
//            }else {
//                System.out.println(s1);
//            }
//
//        }

        return "";
    }



}
